package com.yichang.comisiones.controller;

import com.yichang.comisiones.dto.EmpleadoDTO;
import com.yichang.comisiones.dto.UsuarioDTO;
import com.yichang.comisiones.service.EmpleadoService;
import com.yichang.comisiones.service.UsuarioService;
import java.security.Principal;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

/**
 *
 * @author gian
 */
@Controller("usuarioController")
public class UsuarioController {

    @Autowired
    private UsuarioService usuarioService;
    
    @Autowired
    private EmpleadoService empleadoService;
    
    private static Logger log = LoggerFactory.getLogger(UsuarioController.class);

    @RequestMapping("usuarios/index")
    public ModelAndView index(HttpServletRequest request,
                              Principal principal,
                              @RequestParam(value="filter", required=false) String filter) {
        
        ModelAndView mav = new ModelAndView("usuarios/index");
        List<UsuarioDTO> usuarios;
        List<UsuarioDTO> administradores;
        if (filter == null) {
            usuarios = usuarioService.buscarTodos(false);
            administradores = usuarioService.buscarTodos(true);
        } else {
            usuarios = usuarioService.buscarPorNombre(filter.toUpperCase());
            administradores = usuarioService.buscarTodos(true);
        }
        mav.addObject("usuarios", usuarios);       
        mav.addObject("administradores",administradores);
        request.getSession().setAttribute("username",principal.getName());
        return mav;
    }
    
    @RequestMapping(value = "usuarios/new", method = RequestMethod.GET)
    public ModelAndView newUsuario() {
        ModelAndView mav = new ModelAndView("usuarios/new");
        UsuarioDTO usuario = new UsuarioDTO();
        List<EmpleadoDTO> empleados = empleadoService.listarEmpleadosNoAsociados();
        mav.getModelMap().put("usuario", usuario);
        mav.getModelMap().put("empleados",empleados);
        return mav;
    }

    @RequestMapping(value = "usuarios/new",
                    method = RequestMethod.POST)
    public String createUsuario(@Valid @ModelAttribute("usuario")UsuarioDTO usuario, 
                                BindingResult result, 
                                SessionStatus status,
                                RedirectAttributes redirectAttributes) {
        if (!result.hasErrors()) {
            try {
                usuarioService.insertar(usuario);
                status.setComplete();
                return "redirect:/pages/usuarios/index";
            } catch (Exception e) {                
                redirectAttributes.addFlashAttribute("duplicateName", e.getMessage());
            }                        
        } else {
            return "usuarios/new";
        }
        return "redirect:/pages/usuarios/new";
    }
    
    @RequestMapping(value = "usuarios/change",method = RequestMethod.GET)
    public ModelAndView showPassword(@RequestParam("id")Integer id) {
        ModelAndView mav = new ModelAndView("usuarios/password");
        UsuarioDTO usuario = usuarioService.buscar(id);
        usuario.setPassword("");
        mav.getModelMap().put("usuario",usuario);
        return mav;
    }
    
    @RequestMapping(value = "usuarios/change",method = RequestMethod.POST)
    public String changePassword(@ModelAttribute("usuario") UsuarioDTO usuario, SessionStatus status) {
        usuarioService.changePassword(usuario);
        status.setComplete();
        return "redirect:/pages/usuarios/index";
    }
    
    @RequestMapping(value = "usuarios/edit", method = RequestMethod.GET)
    public ModelAndView editUsuario(@RequestParam("id")Integer id) {    
        ModelAndView mav = new ModelAndView("usuarios/edit");
        UsuarioDTO usuario = usuarioService.buscar(id);
        List<EmpleadoDTO> empleados = empleadoService.listarEmpleados();
        mav.getModelMap().put("usuario", usuario);
        mav.getModelMap().put("empleados",empleados);
        return mav;        
    }
    
    @RequestMapping(value="usuarios/edit", method=RequestMethod.POST)
    public String update(@ModelAttribute("usuario") UsuarioDTO usuario, SessionStatus status) {
        usuarioService.actualizar(usuario);
        status.setComplete();
        return "redirect:/pages/usuarios/index";
    }
    
    @RequestMapping("usuarios/delete")
    public ModelAndView delete(@RequestParam("id")Integer id)
    {
        ModelAndView mav = new ModelAndView("redirect:/pages/usuarios/index");
        UsuarioDTO usuario = usuarioService.buscar(id);
        usuarioService.eliminar(usuario);
        return mav;
    }
                      
//    @RequestMapping(value = "usuarios/buscar", method=RequestMethod.POST)
//    public ModelAndView buscar(SessionStatus status) {
//        ModelAndView mav = new ModelAndView("usuarios/resultadoBusqueda");
//        log.info("resultado = " + usuarioService.buscarPorNombre(criterio.getNombre()).size());
//        mav.getModel().put("resultado",usuarioService.buscarPorNombre(criterio.getNombre()));
//        return mav;
//    }
    
    /**
     * Carga la pagina inicial de login
     * @param error
     * @return 
     */
    @RequestMapping(value = "public/login", method = RequestMethod.GET)
    public ModelAndView login(@RequestParam(value="error", required=false) boolean error) {
        ModelAndView mav = new ModelAndView("public/login");
        if (error == true) {
            // Assign an error message
            mav.getModel().put("error", "Ha ingresado un nombre de usuario o correo inválido!");
        } else {
            mav.getModel().put("error", "");
        }
        return mav;
    }        
}
